package com.haonan.springboot_exercise.service.impl;

import com.haonan.springboot_exercise.bean.User;
import com.haonan.springboot_exercise.bean.pojo.Result;
import com.haonan.springboot_exercise.dao.AdminDao;
import com.haonan.springboot_exercise.dao.PopServerDao;
import com.haonan.springboot_exercise.dao.SmtpServerDao;
import com.haonan.springboot_exercise.dao.UserDao;
import com.haonan.springboot_exercise.netty.server.SmtpServer;
import com.haonan.springboot_exercise.service.AdminService;
import com.haonan.springboot_exercise.service.PopServerService;
import com.haonan.springboot_exercise.service.SmtpServerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author haonan
 * @date 2021/5/13 15:20
 **/
@Component
public class AdminServiceImpl implements AdminService {

    @Autowired
    AdminDao adminDao;
    @Autowired
    UserDao userDao;
    @Autowired
    PopServerDao popServerDao;
    @Autowired
    SmtpServerDao smtpServerDao;
    @Autowired
    PopServerService popServerService;
    @Autowired
    SmtpServerService smtpServerService;

    @Override
    public Result switchToAdmin(User user) {
        return adminDao.userIsAdmin(user.getUser_name(), user.getUser_password())
                ? Result.succ(null)
                : Result.fail(null);
    }

    /**
     * 修改用户的身份权限
     * 0 普通用户
     * 1 管理员
     *
     * @param user_name
     * @param role_id
     * @return
     */
    @Override
    public Result changeRoleOfUser(String user_name, Boolean role_id) {
        adminDao.changeRoleOfUser(user_name, role_id);
        return Result.succ(null);
    }

    /**
     * 修改用户的禁用/可用状态
     * 0 禁用
     * 1 可用
     *
     * @param user_name
     * @param state_flag
     * @return
     */
    @Override
    public Result changeStateOfUser(String user_name, Boolean state_flag) {
        adminDao.changeStateOfUser(user_name, state_flag);
        return Result.succ(null);
    }

    /**
     * 修改用户的smtp权限
     * 0 禁用
     * 1 可用
     *
     * @param user_name
     * @return
     */
    @Override
    public Result changeSmtpFlagOfUser(String user_name, Boolean smtp_flag) {
        adminDao.changeSmtpFlagOfUser(user_name, smtp_flag);
        return Result.succ(null);
    }

    /**
     * 修改用户的pop权限
     * 0 禁用
     * 1 可用
     *
     * @param user_name
     * @param pop_flag
     * @return
     */
    @Override
    public Result changePopFlagOfUser(String user_name, Boolean pop_flag) {
        adminDao.changePopFlagOfUser(user_name, pop_flag);
        return Result.succ(null);
    }

    /**
     * 修改用户 用户名和密码 信息
     *
     * @param user_name
     * @param new_user_name
     * @param new_user_password
     * @return
     */
    @Override
    public Result changeInfoOfUser(String user_name, String new_user_name, String new_user_password) {
        adminDao.changeInfoOfUser(user_name, new_user_name, new_user_password);
        return Result.succ(null);
    }

    /**
     * 创建新用户
     *
     * @param user User实体
     * @return
     */
    @Override
    public Result createNewUser(User user) {
        // 如果用户名已经存在
        if(userDao.userExists(user.getUser_name())){
            return Result.fail("用户名已经存在");
        } else {
            adminDao.createNewUser(user);
            return Result.succ(userDao.getUserByMessage(user.getUser_name(), user.getUser_password()));
        }
    }

    /**
     * 删除用户
     *
     * @param user_name 用户名
     * @return
     */
    @Override
    public Result deleteUser(String user_name) {
        // 如果用户不存在
        if(!userDao.userExists(user_name)){
            return Result.fail("该用户本就不存在");
        } else {
            adminDao.deleteUser(user_name);
            return Result.succ(null);
        }
    }

    /**
     * 根据用户名获取用户的信息
     * @param user_name
     * @return
     */
    @Override
    public Result getUser(String user_name){
        User user=adminDao.getUser(user_name);
        if(user!=null){
            return Result.succ("成功找到该用户",user);
        }else{
            return Result.fail("没有该用户的信息");
        }
    }

    /**
     * 通过用户名模糊查询出用户
     *
     * @param fuzzy_user_name 模糊的用户名
     * @return Result，其中的data放置一个List<User>，存放模糊查询到的用户信息
     */
    @Override
    public Result getUserByFuzzy(String fuzzy_user_name) {
        return adminDao.getUserByFuzzy(fuzzy_user_name) != null
                ? Result.succ(adminDao.getUserByFuzzy(fuzzy_user_name))
                : Result.fail("没有查询到符合条件的用户");
    }

    /**
     * 获取所有用户信息
     *
     * @return Result, data是List<User>
     */
    @Override
    public Result getAllUser() {
        return Result.succ("共有"+adminDao.getAllUser().size()+"个用户",adminDao.getAllUser());
    }

    /**
     * 获取Pop状态
     *
     * @return
     */
    @Override
    public Result getPopState() {
        return Result.succ(popServerDao.getState("127.0.0.1"));
    }

    /**
     * 获取Smtp状态
     *
     * @return
     */
    @Override
    public Result getSmtpState() {
        return Result.succ(smtpServerDao.getState("127.0.0.1"));
    }

    /**
     * 获取Pop状态
     *
     * @return
     */
    @Override
    public Result getPopPort() {
        return Result.succ(popServerDao.getPopPort("127.0.0.1"));
    }

    /**
     * 获取Smtp状态
     *
     * @return
     */
    @Override
    public Result getSmtpPort() {
        return Result.succ(smtpServerDao.getSmtpPort("127.0.0.1"));
    }

    /**
     * 关闭系统服务
     *
     * @return
     */
    @Override
    public Result closeSystem() throws Exception {
        if(smtpServerDao.getState("127.0.0.1") == true){
            smtpServerService.closeSmtpServer();
        }
        if(popServerDao.getState("127.0.0.1") == true){
            popServerService.closePopServer();
        }
        return Result.succ(null);
    }

    /**
     * 开启系统服务
     *
     * @return
     */
    @Override
    public Result openSystem() throws Exception {
        if(smtpServerDao.getState("127.0.0.1") == false){
            smtpServerService.openSmtpServer();
        }
        if(popServerDao.getState("127.0.0.1") == false){
            popServerService.openPopServer();
        }
        return Result.succ(null);
    }

    /**
     * 更改服务端口号
     *
     * @param type 类型（pop/smtp）
     * @param port 端口
     * @return
     */
    @Override
    public Result changePort(String type, int port) throws Exception {
        if(type.equals("smtp")){
            smtpServerService.closeSmtpServer();
            adminDao.changePort(type,port);
            smtpServerService.openSmtpServer();
        } else if(type.equals("pop")){
            popServerService.closePopServer();
            adminDao.changePort(type,port);
            popServerService.openPopServer();
        }
        return Result.succ(null);
    }
}
